package com.zg.invoice.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotBlank;
import java.util.Date;
import java.util.List;

@Data
@ApiModel(value = "开票入参", description = "开票基本信息对象")
public class OpenInvoiceReq {
    /**
     * 购方名称
     */
    @ApiModelProperty(value = "购方名称")
    private String buyerName;

    /**
     * 购方税号
     */
    @ApiModelProperty(value = "购方税号")
    private String buyerTaxnum;

    /**
     * 购方地址
     */
    @ApiModelProperty(value = "购方地址")
    private String buyerAddress;

    /**
     * 购方电话
     */
    @ApiModelProperty(value = "购方电话")
    private String buyerPhone;

    /**
     * 购方开户行
     */
    @ApiModelProperty(value = "购方开户行")
    private String buyerBank;

    /**
     * 购方银行账号
     */
    @ApiModelProperty(value = "购方银行账号")
    private String buyerAccount;

    /**
     * 订单编号，每个企业唯一
     */
    @NotBlank(message = "唯一标识符不能为空")
    @ApiModelProperty(value = "订单编号，每个企业唯一")
    private String orderNo;

    /**
     * 销方名称
     */
    @ApiModelProperty(value = "销方名称")
    private String sellerName;

    /**
     * 销方税号
     */
    @ApiModelProperty(value = "销方税号")
    private String sellerTaxnum;

    /**
     * 维护在诺税通组织管理中的“公司编码”。
     * sellerTaxnum、companyCode至少填一个。
     * 用来关联出诺税通系统内的“companyId”字段。
     */
    @ApiModelProperty(value = "companyId")
    private String companyCode;

    /**
     * 销方地址
     */
    @ApiModelProperty(value = "销方地址")
    private String sellerAddress;

    /**
     * 销方电话
     */
    @ApiModelProperty(value = "销方电话")
    private String sellerPhone;

    /**
     * 销方开户银行
     */
    @ApiModelProperty(value = "销方开户银行")
    private String sellerBank;

    /**
     * 销方银行账号
     */
    @ApiModelProperty(value = "销方银行账号")
    private String sellerAccount;

    /**
     * 开票类型，
     * 1:蓝票；2:红票
     */
    @ApiModelProperty(value = "开票类型")
    private Integer invoiceType;

    /**
     * 开具红票时是否校验蓝票；invoiceType =2时需要传，默认0
     * 0.校验蓝票是否存在诺税通 1.不校验蓝票是否存在诺税通但校验可冲红金额 2.不校验蓝票是否存在诺税通且不校验可冲红金额
     */
    @ApiModelProperty(value = "开具红票时是否校验蓝票")
    private Integer checkBlue;

    /**
     * 发票种类，默认为电票p。
     * p:电子增值税普通发票，c:增值税普通发票(纸票)，s:增值税专用发票，e:收购发票(电子)，f:收购发票(纸质)，b:增值税电子专用发票，
     * j：机动车发票，u：二手车发票,bs:全电专票(电子),pc:全电普票(电子)，es:全电专票(纸质)；ec:全电普票(纸质)
     */
    @ApiModelProperty(value = "发票种类")
    private String invoiceLine;

    /**
     * 请求来源，默认为0
     * 0 :api接口，可自定义，但必须是诺税通已维护好的枚举值
     */
    @ApiModelProperty(value = "请求来源")
    private Integer requestSrc;

    /**
     * 备注，
     * （注意：不同开票服务器类型支持的备注长度不同，请在提交前做好确认）
     */
    @ApiModelProperty(value = "备注")
    private String remark;

    /**
     * 开票人
     */
    @ApiModelProperty(value = "开票人")
    private String clerker;

    /**
     * 收款人
     */
    @ApiModelProperty(value = "收款人")
    private String payee;

    /**
     * 复核人
     */
    @ApiModelProperty(value = "复核人")
    private String checker;

    /**
     * 对应蓝票发票代码；
     * 红票必填，10位或12位，11位的发票代码请左补0至12位
     */
    @ApiModelProperty(value = "对应蓝票发票代码")
    private String invoiceCode;

    /**
     * 对应蓝票发票号码
     * 红票必填，增值税发票不满8位请左补0，全电发票20位
     */
    @ApiModelProperty(value = "对应蓝票发票号码")
    private String invoiceNumber;

    /**
     * 推送方式，
     * -1:不推送;0:邮箱;1:手机(默认);2:邮箱、手机
     */
    @ApiModelProperty(value = "推送方式")
    private Integer notifyType;

    /**
     * 推送手机 (开票成功会短信提醒购方，推送方式为1或2时，此项必填)
     */
    @ApiModelProperty(value = "推送手机")
    private String notifyPhone;

    /**
     * 推送邮箱（推送方式为0或2时，此项必填）
     */
    @ApiModelProperty(value = "推送邮箱")
    private String notifyEmail;

    /**
     * 清单标志，0:非清单；1:清单，纸票超过8行自动转成清单，电票无清单概念，默认都传0；默认为0。
     */
    @ApiModelProperty(value = "清单标志")
    private Integer listFlag;

    /**
     * listFlag为1时，此项为必填
     * 注意：税局要求清单项目名称固定为：（详见销货清单）
     */
    @ApiModelProperty(value = "listFlag为1时")
    private String listGoodsName;

    /**
     * 开票设备分机号,范围为0-65535，
     * 如需指定设备开票则需传入
     */
    @ApiModelProperty(value = "购方税号")
    private Integer extensionNum;

    /**
     * 开票设备终端号，如需指定设备开票则需传入
     */
    @ApiModelProperty(value = "购方税号")
    private Integer terminalNum;

    /**
     * 机器编号，如需指定设备开票则需传入
     */
    @ApiModelProperty(value = "购方税号")
    private String machineNum;

    /**
     * 代开标志，0:非代开;1:代开。默认0
     * 代开蓝票备注文案要求包含：“代开企业税号:***代开企业名称:***.”；
     * 代开红票备注文案要求：“对应正数发票代码:***号码:***代开企业税号:***代开企业名称:***.”。（代开企业税号与代开企业名称之间仅支持一个空格或无符号）
     */
    @ApiModelProperty(value = "购方税号")
    private Integer substituteFlag;

    /**
     * 开票员所属部门id（诺税通本地系统中的id），如需在诺税通中根据部门筛选查看发票，则可传入
     */
    @ApiModelProperty(value = "购方税号")
    private Long departmentId;

    /**
     * 维护在诺税通部门管理中的“部门编码”。
     * 用来关联出诺税通系统内的“departmentId”字段。
     */
    @ApiModelProperty(value = "购方税号")
    private String departmentCode;

    /**
     * 开票员用户id（诺税通系统中的id），如需在诺税通中根据开票员筛选查看发票，则可传入
     */
    @ApiModelProperty(value = "购方税号")
    private Long userId;

    /**
     * 维护在诺税通用户管理中的“用户编码”。
     * 用来关联出诺税通系统内的“userId”字段。
     */
    @ApiModelProperty(value = "购方税号")
    private String userCode;

    /**
     * 特定要素：0普通发票（默认）01成品油 03机动车04货物运输发票33二手车反向开具
     * 35 矿产品发票
     * 开具货物运输发票时，必填04
     */
    @ApiModelProperty(value = "购方税号")
    private String specificFactor;

    /**
     * 红字信息表编号
     */
    @ApiModelProperty(value = "购方税号")
    private String billInfoNo;

    /**
     * 业务方个性化字段,本应用只作保存。
     */
    @ApiModelProperty(value = "购方税号")
    private String columnFirst;

    /**
     * 业务方个性化字段,本应用只作保存。
     */
    @ApiModelProperty(value = "购方税号")
    private String columnSecond;

    /**
     * 业务方个性化字段,本应用只作保存。
     */
    @ApiModelProperty(value = "购方税号")
    private String columnThree;

    /**
     * 业务方发票开票开票成功/失败、作废结果回调地址
     */
    @ApiModelProperty(value = "购方税号")
    private String bizCallbackUrl;

    /**
     * 汇率
     */
    @ApiModelProperty(value = "购方税号")
    private String exchangeRate;

    /**
     * 汇率日期yyyy-MM-dd格式
     */
    @ApiModelProperty(value = "购方税号")
    private Date exchangeRateTime;

    /**
     * 合同号
     */
    @ApiModelProperty(value = "购方税号")
    private String contractNo;

    /**
     * 提运单号
     */
    @ApiModelProperty(value = "购方税号")
    private String waybillNo;

    /**
     * 业务标识(基础模块设置的业务类型枚举值),默认0
     */
    @ApiModelProperty(value = "购方税号")
    private String businessType;

    /**
     * 冲红原因
     * 1：销售退回
     * 2：开票有误
     * 3：服务终止
     * 4：销售折让
     * 当发票种类为：c/p/f/r/e的红字发票时填写
     */
    @ApiModelProperty(value = "购方税号")
    private Integer redReason;

    /**
     * 购方名称
     */
    @ApiModelProperty(value = "明细")
    private List<OpenInvoiceDetails> detail;

    /**
     * 发票联次  开具数电纸票必传
     */
    @ApiModelProperty(value = "发票联次开具数电纸票必传")
    private String paperInvoiceType;

    /**
     * 每千克煤炭发热量（千卡）
     */
    @ApiModelProperty(value = "每千克煤炭发热量（千卡）")
    private String mtrl;
    /**
     * 干基全硫（%）
     */
    @ApiModelProperty(value = "干基全硫（%）")
    private String mtql;
    /**
     * 干燥无灰基挥发分（%）
     */
    @ApiModelProperty(value = "干燥无灰基挥发分（%）")
    private String mthf;

    /**
     * 来源系统
     */
    @NotBlank(message = "来源系统不能为空")
    @ApiModelProperty(value = "来源系统")
    private String sourceSystem;
    /**
     * 开票系统
     */
    @NotBlank(message = "开票系统不能为空")
    @ApiModelProperty(value = "开票系统1-诺税 2-乐企")
    private String invoiceSystem;

}
